<?php

use Cekurte\Model,
	Cekurte\Form;

namespace Cekurte\Controller;

/**
 * Classe responsável por disponibilizar uma configuração inicial para os controladores de página
 * 
 * @author João Paulo Cercal
 * @version 1.0
 * 
 * @abstract
 */
abstract class Action extends \Zend_Controller_Action
{
    /**
     * @var Zend_Registry Registro da Aplicação 
     */
	protected $registry			= null;
	
    /**
     * @var Zend_Translate Armazena uma instância de Zend_Translate 
     */
	protected $translate		= null;
	
	/**
     * @var Armazena o Action Helper FlashMessenger
     */
	protected $flashMessenger	= null;

	/**
     * @var Armazena o Action Helper Redirector
     */
	protected $redirector		= null;
	
	/**
     * @var Armazena o Action Helper Layout
     */
	protected $layout			= null;
	
	/**
     * @var Model Armazena um model 
     */
	protected $model			= null;
	
	/**
     * @var Form Armazena um formulário 
     */
	protected $form				= null;
	
	/**
	 * @var mixed Id do registro no caso de atualização ou remoção de um registro
	 */
	protected $id 				= null;
	
	/**
     * Este método é chamado automaticamente a cada requisição pelo método init().
     * Dessa forma quando se faz necessário adicionar algum comportamento na inicialização
     * de um controlador a classe filha deve implementar esse método.
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
	protected function setup() { }
	
    /**
     * Este método é chamado automaticamente a cada requisição ao controlador
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	void
     */
    public function init()
    {
		$this->registry 			= \Zend_Registry::getInstance();
		
		$this->translate 			= $this->registry->Zend_Translate;
		
		$this->layout 				= $this->getHelper('Layout');
		
		$this->flashMessenger		= $this->getHelper('FlashMessenger');
		
		$this->redirector 			= $this->getHelper('Redirector');
		
		$this->id 					= $this->getRequest()->getParam('id', 0);
		
		$this->setup();
    }
    
    /**
     * Este método é chamado automaticamente antes de cada requisição ao controlador
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	void
     */
    public function preDispatch()
    {
    	$controller = $this->getRequest()->getControllerName();
    	
    	if( $controller !== 'user' )
    	{
	    	$auth = \Zend_Auth::getInstance();
	    	
	        if( !$auth->hasIdentity() )
	        {
	        	$this->redirector->gotoRoute( array(), 'login' );
	        }
    	}
    	
    	if( \Zend_Auth::getInstance()->hasIdentity() )
		{
			$this->view->user 		= \Zend_Auth::getInstance()->getIdentity()->user->username;
		}
    }
    
    /**
     * Este método é chamado automaticamente após cada requisição ao controlador
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	void
     */
    public function postDispatch()
    {
    	$auth = \Zend_Auth::getInstance();
        
        if( $auth->hasIdentity() )
        {
        	// Armazena o token disponibilizado ao usuário no momento do login
        	$tokenUser = $auth->getIdentity()->user->token;
        	
        	if( $this->getRequest()->isPost() )
        	{
        		// Pega o token enviado no formulário
        		$tokenForm 	= $this->getRequest()->getParam('token');
        		
        		$controller = $this->getRequest()->getControllerName();
        		
	        	// Se: 	 o token do formulário não for igual ao token do usuário
		        // OU Se o token do usuário for inexistente
		        // OU Se o token do formulário for inexistente
		        // OU Se o controlador acessado não for UserController
		        if( ($tokenForm != $tokenUser) or empty( $tokenUser ) or empty( $tokenForm ) )
		        {
		        	if( $controller !== 'user' )
		        	{
		        		throw new \Exception('Acesso Negado!');	
		        	}
		        }
        	}
        }
        
    	if( $this->flashMessenger->hasMessages() )
		{
			$this->view->messages 	= $this->flashMessenger->getMessages();
		}
		
    	if( $this->flashMessenger->hasCurrentMessages() )
		{
			$this->view->messages 	= $this->flashMessenger->getCurrentMessages();
		}
    }
}

?>
